#pragma once

#include <iostream>
#include <string>
#include <unordered_map>
#include <fstream>
#include <vector>
#include "tools.hpp"

struct Question
{
    std::string id_;//题目id
    std::string title_;//题目标题
    std::string star_;//题目难易程度
    std::string path_;//题目路径

    std::string desc_;//题目描述
    std::string header_cpp_;//题目预定义的头
    std::string tail_cpp_;//题目的尾，包含测试用例以及调用逻辑
};

class ojModel
{
    private:
        std::unordered_map<std::string,Question> ques_map_;

    public:
        ojModel()
        {
            Load("./oj_data/oj_config.cfg");
        }

        ~ojModel()
        {

        }

        //从文件当中获取题目信息
        bool Load(const std::string& filename)
        {
            std::ifstream file(filename.c_str());
            if(!file.is_open())
            {
                std::cout<<"config file open failed"<<std::endl;
                return false;
            }
            //1.打开文件成功的情况
            //   1.1从文件当中获取每一行信息
            //          1.1.1对于每一行信息，还需要获取题号，名称，难易程度，题目路径
            //          1.1.2保存在Question中
            //2.把多个question组织在unordered_map中
            
            std::string line;
            while(std::getline(file,line))
            {
                std::vector<std::string> vec(7);
                //is_any_of:支持多个字符作为分隔符
                //token_compress_off:是否将多个分隔符看做是一个
                //boost::split(vec,line,boost::is_any_of("\t"),boost::token_compress_off);
                StringUtil::Split(line," ",&vec);
                Question ques;
                ques.id_=vec[0];
                ques.title_=vec[1];
                ques.star_=vec[2];
                ques.path_=vec[3];
                FileUtil::ReadFile(ques.path_+"/desc.txt",&ques.desc_);
                FileUtil::ReadFile(ques.path_+"/header.cpp",&ques.header_cpp_);
                FileUtil::ReadFile(ques.path_+"/tail.cpp",&ques.tail_cpp_);

                ques_map_[ques.id_]=ques;
            }
            file.close();
            return true;
        }

        //提供给上层一个调用所有试题的接口
        bool GetAllQuestion(std::vector<Question>* questions)
        {
            //1.遍历map，将试题信息返回给调用者
            //对于每一个试题，都是一个Question结构体
            for(const auto& kv:ques_map_)
            {
                questions->push_back(kv.second);
            }
            std::sort(questions->begin(),questions->end(),[](const Question& l,const Question& r)
                        {
                        return std::stoi(l.id_)<std::stoi(r.id_);
                        });
            return true;
        }

        //提供给上层一个获取单个试题的接口
        bool GetOneQuestion(const std::string id,Question* ques)
        {
            auto it=ques_map_.find(id);
            if(it==ques_map_.end())
            {
                return false;
            }
            *ques=it->second;
            return true;
        }
};
